package juc.day02;

/*
题目：判断打印的是”one” or “two”

1.两个普通同步方法，两个线程，标准打印，打印？//one   two
2.新增Thread.sleep()，给getOne()，打印？//one   two
3.新增普通方法getThread()，打印？//thread     one     two
4.两个普通同步方法，两个相同类不同对象，打印//two    one
5.修改getOne为静态同步方法，打印？//two  one
6.修改两个方法均为静态同步方法，一个number对象？//one   two
7.一个是静态同步方法，一个非静态同步方法，两个对象//    two one
8.两个静态同步方法，两个对象？//one   two


当一个对象持有锁，另一个对象不能竞争锁
线程8锁的关键在于：
    1.非静态方法的锁为默认为this，静态方法的锁对应的Class实例
    2.在某一时刻内，只能有一个线程持有锁，不管有多少个方法

 */
public class TestThread8Monitor {

    public static void main(String[] args) {
        Number number = new Number();
        Number number2 = new Number();
        new Thread(new Runnable() {
            @Override
            public void run() {
                number.getOne();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                number2.getTwo();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                number2.getThread();
            }
        }).start();
    }
}


class Number {
    public static synchronized void getOne() {//静态同步方法锁对象：Number.class，只有一个
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("one");
    }
    /*
    当多个方法加上static ，就意味着多个方法存在竞争关系，同时竞争对象实例
    对象实例有且只有一个，意味着同一时间只能有一个方法获得锁并执行
     */

    public synchronized void getTwo() {
        System.out.println("two");
    }

    public void getThread() {
        System.out.println("Thread");
    }
}
